<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Dbstl miscellaneous notes</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
    <link rel="up" href="stl.html" title="Chapter 8. Standard Template Library API" />
    <link rel="prev" href="stl_memory_mgmt.html" title="Dbstl memory management" />
    <link rel="next" href="stl_known_issues.html" title="Dbstl known issues" />
  </head>
  <body>
    <div xmlns="" class="navheader">
      <div class="libver">
        <p>Library Version 12.1.6.2</p>
      </div>
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Dbstl miscellaneous notes</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="stl_memory_mgmt.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 8. Standard Template Library API</th>
          <td width="20%" align="right"> <a accesskey="n" href="stl_known_issues.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="stl_misc"></a>Dbstl miscellaneous notes</h2>
          </div>
        </div>
      </div>
      <div class="toc">
        <dl>
          <dt>
            <span class="sect2">
              <a href="stl_misc.html#idm140526455136624">Special notes about trivial methods</a>
            </span>
          </dt>
          <dt>
            <span class="sect2">
              <a href="stl_misc.html#idm140526455145664">Using correct container and iterator public
            types</a>
            </span>
          </dt>
        </dl>
      </div>
      <div class="sect2" lang="en" xml:lang="en">
        <div class="titlepage">
          <div>
            <div>
              <h3 class="title"><a id="idm140526455136624"></a>Special notes about trivial methods</h3>
            </div>
          </div>
        </div>
        <p> 
            There are some standard STL methods which are
            meaningless in dbstl, but they are kept in dbstl as no-ops
            so as to stay consistent with the standard. These are: 
        </p>
        <table class="simplelist" border="0" summary="Simple list">
          <tr>
            <td>
                <code class="methodname">db_vecter::reserve();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_vector::max_size();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_vector::capacity();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_map::reserve();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_map::max_size();</code>
            </td>
          </tr>
        </table>
        <p>
            <code class="methodname">db_vector&lt;&gt;::max_size()</code> and
            <code class="methodname">db_map&lt;&gt;::max_size()</code>
            both return 2^30. This does not mean that Berkeley DB can
            only hold that much data. This value is returned to
            conform to some compilers' overflow rules — if we
            set bigger numbers like 2^32 or 2^31, some compilers
            complain that the number has overflowed.
        </p>
        <p> 
            See the Berkeley DB documentation for information about
            limitations on how much data a database can store. 
        </p>
        <p>
            There are also some read-only functions. You set the
            configuration for these using the Berkeley DB API. You
            access them using the container's methods. Again, this is
            to keep consistent with C++ standard STL containers, such
            as: 
        </p>
        <table class="simplelist" border="0" summary="Simple list">
          <tr>
            <td>
                <code class="methodname">db_map::key_comp();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_map::value_comp();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_map::hash_funct();</code>
            </td>
          </tr>
          <tr>
            <td>
                <code class="methodname">db_map::key_eq();</code>
            </td>
          </tr>
        </table>
      </div>
      <div class="sect2" lang="en" xml:lang="en">
        <div class="titlepage">
          <div>
            <div>
              <h3 class="title"><a id="idm140526455145664"></a>Using correct container and iterator public
            types</h3>
            </div>
          </div>
        </div>
        <p> 
            All public types defined by the C++ STL specification
            are present in dbstl. One thing to note is the <span class="bold"><strong>value_type</strong></span>. dbstl defines the
            <span class="bold"><strong>value_type</strong></span> for each
            iterator and container class to be the raw type without
            the
            <code class="classname">ElementRef</code>/<code class="classname">ElementHolder</code>
            wrapper, so this type of variable can not be used to store
            data in a database. There is a <span class="bold"><strong>value_type_wrap</strong></span> 
            type for each container
            and iterator type, with the raw type wrapped by the
            <code class="classname">ElementRef</code>/<code class="classname">ElementHolder</code>.
        </p>
        <p>
            For example, when type <code class="literal">int_vector_t</code>
            is defined as 
        </p>
        <pre class="programlisting">db_vector&lt;int, ElementHolder&lt;int&gt; &gt;</pre>
        <p>
            its <span class="bold"><strong>value_type</strong></span> is
            <code class="literal">int</code>, its <span class="bold"><strong>value_type_wrap</strong></span>
            is <code class="literal">ElementHolder&lt;int&gt;</code>, and its
            reference and pointer types are
            <code class="literal">ElementHolder&lt;int&gt;&amp;</code> and
            <code class="literal">ElementHolder&lt;int&gt;*</code>
            respectively. If you need to store data, use <span class="bold"><strong>value_type_wrap</strong></span> to make use of
            the wrapper to store data into database.
        </p>
        <p> 
            The reason we leave <span class="bold"><strong>value_type</strong></span> 
            as the raw type is that we want the existing algorithms in the STL 
            library to work with dbstl because we have seen that without doing so, 
            a few tests will fail. 
        </p>
        <p> 
            You need to use the same type as the return type of the
            data element retrieval functions to hold a value in order
            to properly manipulate the data element. For example, when
            calling 
        </p>
        <pre class="programlisting">db_vector&lt;T&gt;::operator[]</pre>
        <p>
            check that the return type for this function is
        </p>
        <pre class="programlisting">db_vector&lt;T&gt;::datatype_wrap</pre>
        <p> 
            Then, hold the return value using an object of the same
            type: 
        </p>
        <pre class="programlisting">db_vector&lt;T&gt;::datatype_wrap refelem = vctr[3];</pre>
      </div>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="stl_memory_mgmt.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="stl.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="stl_known_issues.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Dbstl memory management </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Dbstl known issues</td>
        </tr>
      </table>
    </div>
  </body>
</html>
